import {text2audio} from "@/api/tool/baidutts"

let audio = undefined;
let isAudioPlaying = false; //当前是否正在播放音频
let waitingPlayAudioItemArr = []; //等待播放的文本数组
let timerId = undefined;

function initAudio() {

  if (!audio) {
    audio = new Audio();
    audio.addEventListener("canplaythrough", event => {
      console.log("音频准备完成，开始播放！ event: ", event)
      isAudioPlaying = true;
      audio.play();
    });

    audio.addEventListener("ended", event => {
      console.log("音频播放结束, waitingPlayAudioItemArr.length: ", waitingPlayAudioItemArr.length)
      isAudioPlaying = false;

      if (waitingPlayAudioItemArr.length > 0) {
        //删除并返回数组的第一个元素。
        let firstAudioItem = waitingPlayAudioItemArr.shift();
        executeAudioPlay(firstAudioItem);
      }

      //判断waitingPlayAudioItemArr是否为空，如果为空则关闭循环播放计时器
      // if (waitingPlayAudioItemArr.length === 0) {
      //   if (timerId) {
      //     clearInterval(timerId);
      //     timerId = undefined;
      //     console.log("关闭音频播放定时器！")
      //   }
      // } else { //此时说明waitingPlayAudioItemArr中还存在待播放的音频对象
      //   if (!timerId) {
      //     console.log("开启音频播放定时器！")
      //     timerId = setInterval(() => {
      //       console.log("音频播放定时器执行，isAudioPlaying= ", isAudioPlaying, ", waitingPlayAudioItemArr.length= ", waitingPlayAudioItemArr.length)
      //       if (!isAudioPlaying) {
      //         //再次判断waitingPlayAudioItemArr是否为空，如果为空则关闭循环播放计时器，否则就取出第一个音频对象并进行播放
      //         if (waitingPlayAudioItemArr.length === 0) {
      //           clearInterval(timerId);
      //           timerId = undefined;
      //           console.log("关闭音频播放定时器！")
      //         } else {
      //           //删除并返回数组的第一个元素。
      //           let firstAudioItem = waitingPlayAudioItemArr.shift();
      //           executeAudioPlay(firstAudioItem);
      //         }
      //       }
      //     }, 500)
      //   }
      // }

    });

    console.log("initAudio execute. audio: ", audio)
  }
}

/**
 * 使用百度智能云语音合成功能实现文字转语音。
 * @param config
 * tex: 合成的文本，必填。文本长度必须小于1024GBK字节。建议每次请求文本不超过120字节，约为60个汉字或者字母数字。
 *          * 请注意计费统计依据：120个GBK字节以内（含120个）记为1次计费调用；每超过120个GBK字节则多记1次计费调用。
 *          * 如需合成更长文本，推荐使用长文本在线合成。
 * spd: 语速，选填，取值0-15，默认为5中语速。
 * pid: 音调，选填，取值0-15，默认为5中语调。
 * vol: 音量，选填，基础音库取值0-9，精品音库取值0-15，默认为5中音量（取值为0时为音量最小值，并非为无声）。
 * per: 发音人选择, 选填。默认为度小美(0)
 *      基础音库：0为度小美，1为度小宇，3为度逍遥，4为度丫丫，
 *      精品音库：5为度小娇，103为度米朵，106为度博文，110为度小童，111为度小萌，
 */
export function playAudio(text, config = {
  spd: 8,
  vol: 15,
  per: 0,
  pid: 5
}) {
  // console.log("playAudio text: ", text, ", config: ", config)

  if (!text || text.length === 0) {
    console.log("handleSpeakWithBaiduTts text 为空！语音合成失败，无法播放！")
    return;
  }

  if (!audio) {
    initAudio();

    playAudio(text, config);
  } else {
    //创建待播放的音频资源对象
    let audioItem = {
      text: text,
      config: config
    }

    //先判断当前是否正在播放
    if (isAudioPlaying) {
      //当前正在播放音频，因此先将本次收到的文本插入到等待播放的文本数组的末尾，待前面的所有待播放文本都播放完成后再播放此文本
      waitingPlayAudioItemArr.push(audioItem)
    } else { //当前没有播放音频
      //再判断等待播放的文本数组的长度是否大于0
      if (waitingPlayAudioItemArr.length > 0) {
        //此时说明等待播放的文本数组中还有未播放的文本，因此还是需要先将本次收到的文本插入到等待播放的文本数组的末尾，待前面的所有待播放文本都播放完成后再播放此文本
        waitingPlayAudioItemArr.push(audioItem)
      } else {
        //此时等待播放的文本数组中已无待播放的文本，其当前也没有播放音频，因此此时可以直接播放收到的文本

        executeAudioPlay(audioItem);
      }
    }
  }
}

function executeAudioPlay(audioItem) {
  console.log("executeAudioPlay audioItem: ", audioItem)

  isAudioPlaying = true;

  //创建百度tts音频播放参数配置
  let bdTTSconfig = {
    tex: audioItem.text,
    spd: audioItem.config.spd,
    vol: audioItem.config.vol,
    per: audioItem.config.per,
    pid: audioItem.config.pid
  }

  text2audio(bdTTSconfig).then(res => {
    console.log("executeAudioPlay text2audio res: ", res)

    let audioSrc = res.data.audio;
    if (audioSrc && audio) {
      audio.src = audioSrc;
    }
  })
}

/**
 * 使用百度智能云语音合成功能实现文字转语音。
 * @param config
 * tex: 合成的文本，必填。文本长度必须小于1024GBK字节。建议每次请求文本不超过120字节，约为60个汉字或者字母数字。
 *          * 请注意计费统计依据：120个GBK字节以内（含120个）记为1次计费调用；每超过120个GBK字节则多记1次计费调用。
 *          * 如需合成更长文本，推荐使用长文本在线合成。
 * spd: 语速，选填，取值0-15，默认为5中语速。
 * pid: 音调，选填，取值0-15，默认为5中语调。
 * vol: 音量，选填，基础音库取值0-9，精品音库取值0-15，默认为5中音量（取值为0时为音量最小值，并非为无声）。
 * per: 发音人选择, 选填。默认为度小美(0)
 *      基础音库：0为度小美，1为度小宇，3为度逍遥，4为度丫丫，
 *      精品音库：5为度小娇，103为度米朵，106为度博文，110为度小童，111为度小萌，
 */
export function handleSpeakWithBaiduTts(tex, spd = 8, vol = 15, per = 0, pid = 5) {
  if (!tex || tex.length === 0) {
    console.log("handleSpeakWithBaiduTts tex 为空！语音合成失败！")
    return;
  }

  //创建音频播放参数配置
  let config = {
    tex,
    spd,
    vol,
    per,
    pid
  }
  console.log("handleSpeakWithBaiduTts config: ", config)

  text2audio(config).then(res => {
    console.log("text2audio res: ", res)
    // const blob = new Blob([res.data])
    // saveAs(blob, decodeURIComponent(res.headers['download-filename']))

    // var audioFile = blobToFile(res.data, "audio.mp3");
    // console.log("audioFile: ", audioFile)

    let audioSrc = res.data.audio;
    if (audioSrc) {
      let audio = new Audio();
      audio.src = res.data.audio;

      audio.addEventListener("canplaythrough", event => {
        console.log("音频准备完成，开始播放！ event: ", event)
        audio.play();
      });

      audio.addEventListener("ended", event => {
        console.log("音频播放结束, event: ", event)
      });

    }
  })
}
